package com.sogoodsoft.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

import com.sogoodsoft.service.ServiceException;

/**
 *科学计算，提供小数点后四位的精确计算
 *四舍五入精确到小数点后两位
 * @author LXZ
 * 
 */
public class Computer {

	/*除法精确到的小数位*/
	public static int scale=4;
	
	/*四舍五入精确到的小数位*/
	public static int roundbit = 2;
	
	/*舍入模式， round(1.5)=2 round(-1.5)=1*/
	public static RoundingMode mode = RoundingMode.CEILING;
	
	/**
	 * @param args
	 */
	@SuppressWarnings("unused")
    public static void main(String[] args) {
		String v1 = "1";
		String v2 = "3";
		String val = Computer.roundMutiply(v2,"10","0.11");
		System.out.print(val);
	}
	
	/**
	 * 四舍五入到小数点后两位
	 * @param v1
	 * @return
	 */
	public static String round(String val){
		BigDecimal v1 = new BigDecimal(val);
		BigDecimal v2 = new BigDecimal("1");
		return v1.divide(v2, roundbit, mode).toPlainString();
	}
	
	public static String div(String v1,String v2){
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return bv1.divide(bv2,scale,mode).toPlainString();
	}
	
	public static String mutiply(String v1,String v2){
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return bv1.multiply(bv2).toPlainString();
	}

	public static String add(String v1,String v2){
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return bv1.add(bv2).toPlainString();
	}
	
	public static String subtract(String v1,String v2){
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return bv1.subtract(bv2).toPlainString();
	}
	
	/**
	 * 多个数值相乘后，再四舍五入到小数点后两位
	 * @param val
	 * @return
	 */
	public static String roundMutiply(String...val){
		if(val==null||val.length==0){
			throw new ServiceException("舍入乘法计算错误，没有传递数值，无法进行乘法计算！");
		};
		BigDecimal result = new BigDecimal(1);
		for(String v:val){
			BigDecimal b = new BigDecimal(v);
			result = result.multiply(b);
		}
		return round(result.toPlainString());
	}
	
	/**
	 * 多个数值相加后，再四舍五入到小数点后两位
	 * @param val
	 * @return
	 */
	public static String roundAdd(String...val){
		if(val==null||val.length==0){
			throw new ServiceException("舍入加法计算错误，没有传递数值，无法进行加法计算！");
		};
		BigDecimal result = new BigDecimal(0);
		for(String v:val){
			BigDecimal b = new BigDecimal(v);
			result = result.add(b);
		}
		return round(result.toPlainString());
	}
}
